package com.baiyu.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RawDataLoggingHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof ByteBuf) {
            ByteBuf byteBuf = (ByteBuf) msg;
            // 复制一份 ByteBuf 避免修改原始数据
            ByteBuf copy = byteBuf.copy();
            // 读取字节数组
            byte[] bytes = new byte[copy.readableBytes()];
            copy.readBytes(bytes);
            // 打印原始字节（十六进制和字符串形式，方便调试）
            log.debug("接收原始帧（字节数：" + bytes.length + "）：");
            log.debug("十六进制：" + bytesToHex(bytes));
            log.debug("字符串形式：" + new String(bytes)); // 注意：二进制数据可能无法转字符串
            copy.release();
        }
        // 继续传递数据给下一个处理器（如 Protobuf 解码器）
        super.channelRead(ctx, msg);
    }

    // 辅助方法：字节数组转十六进制字符串
    private String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X ", b));
        }
        return sb.toString();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 打印异常信息（包含无效 tag 错误）
        log.error("-----------错误------------" ,cause);
        ctx.close();
    }
}